/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simulateurs.model.monde;
import java.awt.Color;
import java.util.ArrayList;
import simulateurs.model.automate.Automate;
import java.util.Random;
import simulateurs.controllers.SoundPlayer;
/**
 *
 * @author Jah
 */
public class Robot extends Cercle{
    private ArrayList<Automate> automates=null;
    private int direction;
    private String nomEquipe=null;
    private Equipe equipe=null;
    private int vision;
    private int tempsCache; // temps de cache
    private int timer; // doit etre initialisé à 0
    private double vitesse;
    private Balle balle; // un robot peu posseder une balle
    private But but;
    private int timerAvance; // compte depuis combien de temps le robot avance (dans une direction aleatoire)
    private int timerAvanceMax;

    SoundPlayer Gballe= new SoundPlayer("g:/demo/button-9.wav");
    SoundPlayer Goal= new SoundPlayer("g:/demo/beep-7.wav");

    public Robot(){
        super(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    // -> MAUVAIS CONSTRUCTEUR !!!
    public Robot(Point position, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, int tempsCache, double vitesse){
        super(position,equipe.getCouleur());
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.tempsCache=tempsCache;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=null;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    public Robot(Point position, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, int tempsCache, double vitesse, But but){
        super(position,equipe.getCouleur());
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.tempsCache=tempsCache;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=but;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    
    
    // pour le parser XML
    public Robot(Point position, double diametre, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, int tempsCache, double vitesse, Color couleur){
        super(position,couleur,diametre);
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.tempsCache=tempsCache;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=null;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    // pour le parser XML
    public Robot(double diametre, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, int tempsCache, double vitesse, Color couleur){
        super(couleur,diametre);
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.tempsCache=tempsCache;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=null;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    
     // pour le parser XML
    public Robot(double diametre, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, double vitesse, Color couleur){
        super(couleur,diametre);
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=null;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    
    
    
    public Robot(Point position, double diametre, Equipe equipe, ArrayList<Automate> automates, int direction, int vision, int tempsCache, double vitesse){
        super(position,equipe.getCouleur(),diametre);
        this.automates=automates;
        this.direction=direction;
        this.nomEquipe=equipe.getNom();
        this.equipe=equipe;
        this.vision=vision;
        this.tempsCache=tempsCache;
        this.vitesse=vitesse;
        this.timer=0;
        this.balle=null;
        this.but=null;  // /!\ A AJOUTER DANS LE CONSTRUCTEUR
        setTimerAvance(0);
        setTimerAvanceMax(); // setTimerAvanceMax(min,max); min et max definis !!
    }
    
    // ajout d'une liste des balle pour detecter les collisions
    public void avancerTournerTimeravance(ArrayList<Equipe> equipeList,ArrayList<Balle> balleList,ArrayList<But> butList){
        int valeur;
        
        Random r = new Random();
        int randomMax = 101;
        valeur = r.nextInt(randomMax);
        
        
        
        if(getTimerAvance() >= this.getTimerAvanceMax()){
            
            // System.out.println("\nLe random est : " + valeur);
            //System.out.println("Le timer actuel est : " + this.getTimerAvance());
            // System.out.println("Le timer max est : " + this.getTimerAvanceMax());
            if(valeur > (randomMax-1)/2){// si valeur max, peut choisir d'avancer ou de tourner, reset avance et nvelle valeur avancemax
                avancer(equipeList,balleList,butList);
            }
            else{
              tourner(false,0);  
            }
            setTimerAvance(0);
            setTimerAvanceMax();
        }
        else
        {
            avancer(equipeList,balleList,butList);
            setTimerAvance(getTimerAvance()+1);
        }
    }
    
    /*
     * public void avancer(ArrayList<Equipe> equipeList){ // passe en parametre une liste dequipe pour tester les colisions
     *
     * // il faut tester si il y a un robot devant -> gestion colision
     * // fonction tester colision
     * // si colision, tourne ou ne fait rien aléatoirement
     * int nb;
     * java.util.Random r=new java.util.Random() ; // random si il y a un robot au prochain emplacement, tourne ou ne fait rien
     * nb = r.nextInt(2);
     *
     * // attention aux axes du repère
     * // !!! La vitesse n'est pas encore prise en compte !
     * //PB de la vitesse va pouvoir passer a traver des robots !
     * if(direction == 0)
     * {
     * // si robot a getCentre().getAbscisse() + 1, getCentre().getOrdonnee() ne fait rien
     * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() + this.getVitesse(),getCentre().getOrdonnee())) == null){
     * // pas de robot trouvé au prochain emplacement, on peut avancer
     * getCentre().setAbscisse(getCentre().getAbscisse() + this.getVitesse());
     * }
     * else{
     * if(nb == 0)
     * {
     * tourner(false,0);
     * }
     * else
     * {
     * //rien
     * }
     * }
     *
     * }
     * if (direction == 90 || direction == -270)
     * {
     * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() - this.getVitesse())) == null){
     * getCentre().setOrdonnee(getCentre().getOrdonnee() - this.getVitesse());
     * }
     * else{
     * if(nb == 0)
     * {
     * tourner(false,0);
     * }
     * else
     * {
     * //rien
     * }
     * }
     * }
     * if(direction == 180 || direction == -180)
     * {
     * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() - this.getVitesse(),getCentre().getOrdonnee())) == null){
     * getCentre().setAbscisse(getCentre().getAbscisse() - this.getVitesse());
     * }
     * else{
     * if(nb == 0)
     * {
     * tourner(false,0);
     * }
     * else
     * {
     * //rien
     * }
     * }
     * }
     * if(direction == 270 || direction == -90)
     * {
     * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() + this.getVitesse())) == null){
     * getCentre().setOrdonnee(getCentre().getOrdonnee() + this.getVitesse());
     * }
     * else{
     * if(nb == 0)
     * {
     * tourner(false,0);
     * }
     * else
     * {
     * //rien
     * }
     * }
     * }
     *
     * else{
     * //System.out.println("ERREUR");
     * //System.out.println("***La direction est : " + getDirection());
     *
     * }
     * }
     *
     *
     */
    
    
    
    
    // ajout d'un liste de balle pour detecter les collisions !
    // IL FAUT RENVOYER UN BOOLEEN : TRUE SI COLLISION, FALSE SINON  !!!!!!!
    
    
    public void avancer(ArrayList<Equipe> equipeList,ArrayList<Balle> balleList,ArrayList<But> butList){ // passe en parametre une liste dequipe pour tester les colisions
        
        // il faut tester si il y a un robot devant -> gestion colision
        // fonction tester colision
        // si colision, tourne ou ne fait rien aléatoirement
        Cercle nouveauCercleTmpplus1 = new Cercle(new Point(getCentre().getAbscisse(),getCentre().getOrdonnee()),this.getRayon()*2);
        Cercle robotActuel = null;
        Point collision = null;
        
        int nb;
        java.util.Random r=new java.util.Random() ; // random si il y a un robot au prochain emplacement, tourne ou ne fait rien
        nb = r.nextInt(2);
        
        //System.out.println("La methode avancer est appelée !");
       // System.out.println("\n** Au debut le robot est a : (" + getCentre().getAbscisse() + "," + getCentre().getOrdonnee() + ")");
       // System.out.println("** Sa direction est : " + getDirection());
       // System.out.println("** Sa vitesse est : " + getVitesse());
        
        
        
        // attention aux axes du repère
        // !!! La vitesse n'est pas encore prise en compte !
        //PB de la vitesse va pouvoir passer a traver des robots !
        if(direction == 0)
        {
            // si robot a getCentre().getAbscisse() + 1, getCentre().getOrdonnee() ne fait rien
            // si il y a collision avec une balle ou un robot
            // mettre dans une boucle
            // direction == 0 donc abscisse + 1
            
            
            for (int i =0; i<getVitesse();i++ ){
                
                nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse() + 1,nouveauCercleTmpplus1.getCentre().getOrdonnee()));
                
                
                robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
                collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                if(collision != null){
                    if(nb == 0)
                    {
                        tourner(false,0);
                        break;
                    }
                    else
                    {
                        //rien
                    }
                    
                    break;
                }
                else{
                    // si pas de collision on avance de 1
                    this.getCentre().setAbscisse(this.getCentre().getAbscisse()+1);
                }
            }
            
            // boucle ici
            
            // affectation de la nouvelle valeur de nouvellePosition
            
            
            
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() + this.getVitesse(),getCentre().getOrdonnee())) == null){
             * // pas de robot trouvé au prochain emplacement, on peut avancer
             * getCentre().setAbscisse(getCentre().getAbscisse() + this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             */
        }
        else if (direction == 90 || direction == -270)
        {
            
            // direction vers le haut, donc ordonnee - 1
            
            
            // si robot a getCentre().getAbscisse() + 1, getCentre().getOrdonnee() ne fait rien
            // si il y a collision avec une balle ou un robot
            // mettre dans une boucle
            // direction == 0 donc abscisse + 1
            
            
            for (int i =0; i<getVitesse();i++ ){
                
                nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse(),nouveauCercleTmpplus1.getCentre().getOrdonnee()-1));
                robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
                collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                if(collision != null){
                    if(nb == 0)
                    {
                        tourner(false,0);
                        break;
                    }
                    else
                    {
                        //rien
                    }
                    
                    break;
                }
                else{
                    // si pas de collision on avance de 1
                    this.getCentre().setOrdonnee(this.getCentre().getOrdonnee()-1);
                }
            }
            
            
            /*
             *
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() - this.getVitesse())) == null){
             * getCentre().setOrdonnee(getCentre().getOrdonnee() - this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             * }
             */
            
            
        }
        else if(direction == 180 || direction == -180)
        {
            
            // la direction est vers la gauche
            for (int i =0; i<getVitesse();i++ ){
                
                nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse()-1,nouveauCercleTmpplus1.getCentre().getOrdonnee()));
                robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
                collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                if(collision != null){
                    if(nb == 0)
                    {
                        tourner(false,0);
                        break;
                        // if faudrait ensuite avancer
                    }
                    else
                    {
                        //rien
                    }
                    
                    break;
                }
                else{
                    this.getCentre().setAbscisse(this.getCentre().getAbscisse()-1);
                }
            }
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() - this.getVitesse(),getCentre().getOrdonnee())) == null){
             * getCentre().setAbscisse(getCentre().getAbscisse() - this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             */
            
        }
        else if(direction == 270 || direction == -90)
        {
            
            
            // direction vers le bas, donc ordonnee + 1
            
            for (int i =0; i<getVitesse();i++ ){
                
                nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse(),nouveauCercleTmpplus1.getCentre().getOrdonnee()+1));
                robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
                collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                if(collision != null){
                    if(nb == 0)
                    {
                       // System.out.println("Collision entre robot : ("+nouveauCercleTmpplus1.getCentre().getAbscisse()+","+nouveauCercleTmpplus1.getCentre().getOrdonnee() +") et l'objet : ("+collision.getAbscisse() + ","+collision.getOrdonnee()+")");
                        tourner(false,0);
                        break;
                        // if faudrait ensuite avancer
                    }
                    else
                    {
                        //rien
                    }
                    
                    break;
                }
                else{
                    this.getCentre().setOrdonnee(this.getCentre().getOrdonnee()+1);
                }
            }
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() + this.getVitesse())) == null){
             * getCentre().setOrdonnee(getCentre().getOrdonnee() + this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             *
             */
        }
        
        
        else{
            // System.out.println("ERREUR");
            //System.out.println("***La direction est : " + getDirection());
            
        }
        /*
        if(collision != null){
            System.out.println("Il y a collision !");
        }
        else{
            System.out.println("PAS de collision !");
        }
        */
        //System.out.println("\n** A la fin le robot est a : (" + getCentre().getAbscisse() + "," + getCentre().getOrdonnee() + ")");
        
        //return collision;
    }
    
    
    
    // !!!!!!!!!!!!!!!!!!!!
    // doit renvoyer une objet Point qui est null si aucune collision sinon contient le point(centre) de la colision
    public Point avancerPrudemment(ArrayList<Equipe> equipeList,ArrayList<Balle> balleList,ArrayList<But> butList){ // passe en parametre une liste dequipe pour tester les colisions
        
        // il faut tester si il y a un robot devant -> gestion colision
        // fonction tester colision
        // si colision, tourne ou ne fait rien aléatoirement
        Cercle nouveauCercleTmpplus1 = new Cercle(new Point(getCentre().getAbscisse(),getCentre().getOrdonnee()),this.getRayon()*2);
        Cercle robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
        
        Point collision = null;
        Point collision2 = null;
        int nb;
        java.util.Random r=new java.util.Random() ; // random si il y a un robot au prochain emplacement, tourne ou ne fait rien
        nb = r.nextInt(2);
        
        //System.out.println("La methode avancer est appelée !");
        //System.out.println("\n** Au debut le robot est a : (" + getCentre().getAbscisse() + "," + getCentre().getOrdonnee() + ")");
        //System.out.println("** Sa direction est : " + getDirection());
        //System.out.println("** Sa vitesse est : " + getVitesse());
        
        
        
        // attention aux axes du repère
        // !!! La vitesse n'est pas encore prise en compte !
        //PB de la vitesse va pouvoir passer a traver des robots !
        if(direction == 0)
        {
            // si robot a getCentre().getAbscisse() + 1, getCentre().getOrdonnee() ne fait rien
            // si il y a collision avec une balle ou un robot
            // mettre dans une boucle
            // direction == 0 donc abscisse + 1
            
            
            nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse() + 1,nouveauCercleTmpplus1.getCentre().getOrdonnee()));
            collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
            if(collision != null){ // il faudrait tester si collision avec le bon objet alors avancer sinon tourner
                if(nb == 0)
                {
                    
                    tourner(false,0);
                    // et on essaie d'avancer d'un pas
                    if(getDirection() == 0){
                        collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                            getCentre().setAbscisse(getCentre().getAbscisse()+1);
                        }
                    }
                    else if (getDirection() == 90 || getDirection() == -270){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()-1);
                        }
                    }
                    else if(getDirection() == 180 || getDirection() == -180){
                    collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setAbscisse(getCentre().getAbscisse()-1);
                        }
                    }
                    else if(getDirection() == 270 || getDirection() == -90){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()+1);
                        }
                    }
                            
                    // a revoir
                    
                }
                else
                {
                    //rien
                }
                
            }
            else{
                // si pas de collision on avance de 1
                this.getCentre().setAbscisse(this.getCentre().getAbscisse()+1);
            }
            
            
            // boucle ici
            
            // affectation de la nouvelle valeur de nouvellePosition
            
            
            
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() + this.getVitesse(),getCentre().getOrdonnee())) == null){
             * // pas de robot trouvé au prochain emplacement, on peut avancer
             * getCentre().setAbscisse(getCentre().getAbscisse() + this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             */
        }
        else if (direction == 90 || direction == -270)
        {
            
            // direction vers le haut, donc ordonnee - 1
            
            
            // si robot a getCentre().getAbscisse() + 1, getCentre().getOrdonnee() ne fait rien
            // si il y a collision avec une balle ou un robot
            // mettre dans une boucle
            // direction == 0 donc abscisse + 1
            
            
            
            nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse(),nouveauCercleTmpplus1.getCentre().getOrdonnee()-1));
            collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
            if(collision != null){
                if(nb == 0)
                {
                    tourner(false,0);
                    
                    if(getDirection() == 0){
                        collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                            getCentre().setAbscisse(getCentre().getAbscisse()+1);
                        }
                    }
                    else if (getDirection() == 90 || getDirection() == -270){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()-1);
                        }
                    }
                    else if(getDirection() == 180 || getDirection() == -180){
                    collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setAbscisse(getCentre().getAbscisse()-1);
                        }
                    }
                    else if(getDirection() == 270 || getDirection() == -90){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()+1);
                        }
                    }
                }
                else
                {
                    //rien
                }
                
                
            }
            else{
                // si pas de collision on avance de 1
                this.getCentre().setOrdonnee(this.getCentre().getOrdonnee()-1);
            }
            
            
            
            /*
             *
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() - this.getVitesse())) == null){
             * getCentre().setOrdonnee(getCentre().getOrdonnee() - this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             * }
             */
            
            
        }
        else if(direction == 180 || direction == -180)
        {
            
            // la direction est vers la gauche
            
            nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse()-1,nouveauCercleTmpplus1.getCentre().getOrdonnee()));
            collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
            if(collision != null){
                if(nb == 0)
                {
                    tourner(false,0);
                    
                    if(getDirection() == 0){
                        collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                            getCentre().setAbscisse(getCentre().getAbscisse()+1);
                        }
                    }
                    else if (getDirection() == 90 || getDirection() == -270){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()-1);
                        }
                    }
                    else if(getDirection() == 180 || getDirection() == -180){
                    collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setAbscisse(getCentre().getAbscisse()-1);
                        }
                    }
                    else if(getDirection() == 270 || getDirection() == -90){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()+1);
                        }
                    }
                   
                }
                else
                {
                    //rien
                }
                
                
            }
            else{
                this.getCentre().setAbscisse(this.getCentre().getAbscisse()-1);
            }
            
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse() - this.getVitesse(),getCentre().getOrdonnee())) == null){
             * getCentre().setAbscisse(getCentre().getAbscisse() - this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             */
            
        }
        else if(direction == 270 || direction == -90)
        {
            
            
            // direction vers le bas, donc ordonnee + 1
            
            
            
            nouveauCercleTmpplus1.setCentre(new Point(nouveauCercleTmpplus1.getCentre().getAbscisse(),nouveauCercleTmpplus1.getCentre().getOrdonnee()+1));
            collision = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
            if(collision != null){
                if(nb == 0)
                {
                    tourner(false,0);
                   
                    if(getDirection() == 0){
                        collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                            getCentre().setAbscisse(getCentre().getAbscisse()+1);
                        }
                    }
                    else if (getDirection() == 90 || getDirection() == -270){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()-1);
                        }
                    }
                    else if(getDirection() == 180 || getDirection() == -180){
                    collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setAbscisse(getCentre().getAbscisse()-1);
                        }
                    }
                    else if(getDirection() == 270 || getDirection() == -90){
                     collision2 = detecterCollision(equipeList,balleList,butList,nouveauCercleTmpplus1,robotActuel);
                        // test de collision avec la prochaine destination
                        if(collision2 == null){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()+1);
                        }
                    }
                }
                else
                {
                    //rien
                }
                
                
            }
            else{
                this.getCentre().setOrdonnee(this.getCentre().getOrdonnee()+1);
            }
            
            
            /*
             * if(Robot.rechercherRobotViaPoint(equipeList, new Point(getCentre().getAbscisse(),getCentre().getOrdonnee() + this.getVitesse())) == null){
             * getCentre().setOrdonnee(getCentre().getOrdonnee() + this.getVitesse());
             * }
             * else{
             * if(nb == 0)
             * {
             * tourner(false,0);
             * }
             * else
             * {
             * //rien
             * }
             * }
             *
             */
        }
        
        
        else{
            // System.out.println("ERREUR");
            //System.out.println("***La direction est : " + getDirection());
            
        }
        /*
        if(collision != null){
            System.out.println("Il y a collision !");
        }
        else{
            System.out.println("PAS de collision !");
        }
        */
        //System.out.println("\n** A la fin le robot est a : (" + getCentre().getAbscisse() + "," + getCentre().getOrdonnee() + ")");
        
        return collision;
    }
    
    
    
    
    
    
    
    
    
    // en cours de modif
    
    
    // deviendra se diriger vers balle pour la ramasser
    public void seDirigerVersBalle(Point point, ArrayList<Balle> balleList, ArrayList<Equipe> equipeList, ArrayList<But> butList){
        //System.out.println("#### DANS LA FONCTION SE DIRIGER");
        
        //Cercle robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
        
        Point objetCollision = null;
        //System.out.println("Les coordonnes du robot actuel sont : (" + robotActuel.getCentre().getAbscisse() + "," + robotActuel.getCentre().getOrdonnee() + ")");
        
        
        //avancer(equipeList,balleList);
        //
        //nouveauCercleTmpplus1.getCentre().setAbscisse(this.getCentre().getAbscisse());
        //nouveauCercleTmpplus1.getCentre().setOrdonnee(this.getCentre().getOrdonnee());
        //System.out.println("-Les coordonnes du robot actuel sont : (" + nouveauCercleTmpplus1.getCentre().getAbscisse() + "," + nouveauCercleTmpplus1.getCentre().getOrdonnee() + ")");
        
        
        // on a besoin du rayon de la balle !
        Balle balle = Balle.rechercherBalleViaPoint(balleList, point);
        // doit tester toutes les directions pour aller vers la balle.
        // ensuite si la balle est au meme endroit, la ramasser
        
        //System.out.println("**la balle est à : (" + point.getAbscisse() + "," + point.getOrdonnee() + ")");
        
        
        // modif en cours valide
        // 4 IF ordonnees et abscisses differents
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        //System.out.println("**PREMIER IF");
        //if((getCentre().getAbscisse()+ getRayon() < point.getAbscisse()-point.))
        
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        if((this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()-balle.getRayon())
                && ((this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon())))
        {
            
            if(getDirection() != 0 && getDirection() != 270 && getDirection() != -90){
                tournerDirection(0); // on choisi ça
            }
            else{
                // boucle sur la vitesse et test a l'interieur de la collision
                
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(point.getAbscisse() == getCentre().getAbscisse() || point.getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                    
                    
                }
                
                
            }
        }
        
        // modif en cours validé
        //if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() < getCentre().getOrdonnee()){
        //System.out.println("**DEUXIEME IF");
        else if((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()+balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()>=balle.getCentre().getOrdonnee()+balle.getRayon()))
        {
            
            
            if(getDirection() != 180 && getDirection() != -180 && getDirection() != 90 && getDirection() != -270){
                tournerDirection(180); // on choisi ça
                //System.out.println("**DEUXIEME IF_v1");
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(point.getAbscisse() == getCentre().getAbscisse() || point.getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
                // System.out.println("**DEUXIEME IF_v2");
            }
        }
        
        // modif en cours valide
        
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() < getCentre().getOrdonnee()){
        
        else if((this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()>=balle.getCentre().getOrdonnee()+balle.getRayon())){
            
            //System.out.println("**TROISIEME IF");
            if(getDirection() != 0 && getDirection() != -270 && getDirection() != 90){
                tournerDirection(0); // on choisi ça
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(point.getAbscisse() == getCentre().getAbscisse() || point.getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
            }
        }
        
        // modif en cours valide
        //if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        //System.out.println("**QUATRIEME IF");
        
        else if((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()+balle.getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon())){
            
            
            if(getDirection() != 180 && getDirection() != -180 && getDirection() != -90 && getDirection() != 270){
                tournerDirection(180); // on choisi ça
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(point.getAbscisse() == getCentre().getAbscisse() || point.getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
            }
        }
        
        
        
        //ensuite le cas ou un des deux ou les deux sont égaux
        // modif en cours valide
        // else if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() == getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()-balle.getRayon())
                &&
                (((this.getCentre().getOrdonnee()+this.getRayon()>=balle.getCentre().getOrdonnee()-balle.getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon()))
                || ((this.getCentre().getOrdonnee()-this.getRayon()>=balle.getCentre().getOrdonnee()-balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()>=balle.getCentre().getOrdonnee()+balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon()))
                )
                )
        {
            
            if(getDirection() != 0){
                tournerDirection(0);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                   
                }
            }
        }
        
        
 
        
        // axe des ordonnees inversé attention !
        // modif en cours valide
        //else if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() == getCentre().getOrdonnee()){
        else if(
                
                (this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()+balle.getRayon())
                &&
                (((this.getCentre().getOrdonnee()+this.getRayon()>=balle.getCentre().getOrdonnee()-balle.getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon()))
                || ((this.getCentre().getOrdonnee()-this.getRayon()>=balle.getCentre().getOrdonnee()-balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()>=balle.getCentre().getOrdonnee()+balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()+balle.getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon()))
                )
                )
        {
            
            if(getDirection() != -180 && getDirection() != 180){
                tournerDirection(180);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        // modif en cours
        //else if(point.getAbscisse() == getCentre().getAbscisse() && point.getOrdonnee() >= getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getOrdonnee()+this.getRayon()<=balle.getCentre().getOrdonnee()-balle.getRayon())
                &&
                (((this.getCentre().getAbscisse()+this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()-this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()<=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()>=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                )
                )
        {
            
            if(getDirection() != -90 && getDirection() != 270){
                tournerDirection(270);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        // modif en cours valide
        //else if(point.getAbscisse() == getCentre().getAbscisse() && point.getOrdonnee() <= getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getOrdonnee()-this.getRayon()>=balle.getCentre().getOrdonnee()+balle.getRayon())
                &&
                (((this.getCentre().getAbscisse()+this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()-this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()<=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()>=balle.getCentre().getAbscisse()+balle.getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=balle.getCentre().getAbscisse()-balle.getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=balle.getCentre().getAbscisse()+balle.getRayon()))
                )
                )
        {
            
            if(getDirection() != 90 && getDirection() != -270){
                tournerDirection(90);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        else{
            for(int i=0;i<this.getVitesse();i++){
                objetCollision = avancerPrudemment(equipeList,balleList,butList);
            }
            //objetCollision = balle.getCentre();
            //System.out.println("nulllllllll");
            //System.out.println("Le robot est a : (" + this.getCentre().getAbscisse() + "," + this.getCentre().getOrdonnee() + ")");
            
        }
        
        
        
        // il faudra enlever detecter colision a ce niveau et y mettre daans les boucle des if !!
        // il faut recuperer l'objet dans les ifs
        // a la fin, si apres avoir bougé, meme position, ramasser
        //objetCollision = detecterCollision(equipeList,balleList,nouveauCercleTmpplus1,nouveauCercleTmpplus1);
        
        if(objetCollision != null){
           // System.out.println("Il y a collision avec la balle : (" + objetCollision.getAbscisse() + "," + objetCollision.getOrdonnee() + ")");
            if(balle != null){
                if(objetCollision.getAbscisse() == balle.getCentre().getAbscisse() && objetCollision.getOrdonnee() == balle.getCentre().getOrdonnee()){
                    ramasser(balle);
                }
               
            }
        }
        
        
        // a supprimer !
        /*
         * if(point.pointsMemeEndroit(this.getCentre())){
         * // on cherche la balle a ramasser avec le point
         * balle = Balle.rechercherBalleViaPoint(balleList, point);
         * ramasser(balle);
         * // System.out.println("Implementer la methode ramasser et appeler : ramasser(balle)");
         * }
         */
        // si il faut ramasser la balle, chercher celle qui a les coodonnées du point et appeler ramasser avec la balle
        
        
        
    }
    
   
    
    
    
    // deviendra se diriger vers balle pour la ramasser
    public void seDirigerVersBut(ArrayList<Balle> balleList, ArrayList<Equipe> equipeList,ArrayList<But> butList){
        //System.out.println("#### DANS LA FONCTION SE DIRIGER");
        
        //Cercle robotActuel=new Cercle(new Point(this.getCentre().getAbscisse(),this.getCentre().getOrdonnee()),this.getRayon()*2);
        
        Point objetCollision = null;
        //System.out.println("Les coordonnes du robot actuel sont : (" + robotActuel.getCentre().getAbscisse() + "," + robotActuel.getCentre().getOrdonnee() + ")");
        java.util.Random r=new java.util.Random();
        int randomMax = 101;
        int nbAleatoire = r.nextInt(randomMax);
        
        //avancer(equipeList,balleList);
        //
        //nouveauCercleTmpplus1.getCentre().setAbscisse(this.getCentre().getAbscisse());
        //nouveauCercleTmpplus1.getCentre().setOrdonnee(this.getCentre().getOrdonnee());
        //System.out.println("-Les coordonnes du robot actuel sont : (" + nouveauCercleTmpplus1.getCentre().getAbscisse() + "," + nouveauCercleTmpplus1.getCentre().getOrdonnee() + ")");
        
        
        // on a besoin du rayon de la balle !
        //Balle balle = Balle.rechercherBalleViaPoint(balleList, point);
        // doit tester toutes les directions pour aller vers la balle.
        // ensuite si la balle est au meme endroit, la ramasser
        
        //System.out.println("**la balle est à : (" + point.getAbscisse() + "," + point.getOrdonnee() + ")");
        
        
        // modif en cours valide
        // 4 IF ordonnees et abscisses differents
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        //System.out.println("**PREMIER IF");
        //if((getCentre().getAbscisse()+ getRayon() < point.getAbscisse()-point.))
        
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        if((this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()-getBut().getRayon())
                && ((this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon())))
        {
            
            if(getDirection() != 0 && getDirection() != 270 && getDirection() != -90){
                tournerDirection(0); // on choisi ça
            }
            else{
                // boucle sur la vitesse et test a l'interieur de la collision
                
                if(nbAleatoire >(randomMax-1)/100)
                {
                    
                    for(int i=0;i<this.getVitesse();i++){
                        // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                        objetCollision = avancerPrudemment(equipeList,balleList,butList);
                        
                        // si l'ordonnee = .. ou abscisse = ...
                        if(getBut().getCentre().getAbscisse() == getCentre().getAbscisse() || getBut().getCentre().getOrdonnee() == getCentre().getOrdonnee()){
                            break;
                        }
                        
                        
                    }
                }
                else{
                    if(this.getDirection()==0){
                        this.setDirection(270);
                    }
                    else{
                        this.setDirection(0);
                    }
                }
                
                
            }
        }
        
        // modif en cours validé
        //if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() < getCentre().getOrdonnee()){
        //System.out.println("**DEUXIEME IF");
        else if((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()+getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()>=getBut().getCentre().getOrdonnee()+getBut().getRayon()))
        {
            
            
            if(getDirection() != 180 && getDirection() != -180 && getDirection() != 90 && getDirection() != -270){
                tournerDirection(180); // on choisi ça
                //System.out.println("**DEUXIEME IF_v1");
            }
            else{
                 if(nbAleatoire >(randomMax-1)/100)
                {
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(getBut().getCentre().getAbscisse() == getCentre().getAbscisse() || getBut().getCentre().getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
                }
                // System.out.println("**DEUXIEME IF_v2");
                 else{
                     if(getDirection()==180 ||getDirection()==-180){
                         setDirection(90);
                     }
                     else{
                         setDirection(180);
                     }
                 }
            }
        }
        
        // modif en cours valide
        
        //if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() < getCentre().getOrdonnee()){
        
        else if((this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()>=getBut().getCentre().getOrdonnee()+getBut().getRayon())){
            
            //System.out.println("**TROISIEME IF");
            if(getDirection() != 0 && getDirection() != -270 && getDirection() != 90){
                tournerDirection(0); // on choisi ça
            }
            else{
                if(nbAleatoire >(randomMax-1)/100)
                {
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(getBut().getCentre().getAbscisse() == getCentre().getAbscisse() || getBut().getCentre().getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
                }
                else{
                    if(getDirection()==0){
                        setDirection(90);
                    }
                    else{
                        setDirection(0);
                    }
                }
            }
        }
        
        // modif en cours valide
        //if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() > getCentre().getOrdonnee()){
        //System.out.println("**QUATRIEME IF");
        
        else if((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()+getBut().getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon())){
            
            
            if(getDirection() != 180 && getDirection() != -180 && getDirection() != -90 && getDirection() != 270){
                tournerDirection(180); // on choisi ça
            }
            else{
                if(nbAleatoire >(randomMax-1)/100)
                {
                for(int i=0;i<this.getVitesse();i++){
                    // ajouter un test pour savoir si l'ordonne ou l'abscisse est egal, dans ce cas la il faut BREAK !!
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                    // si l'ordonnee = .. ou abscisse = ...
                    if(getBut().getCentre().getAbscisse() == getCentre().getAbscisse() || getBut().getCentre().getOrdonnee() == getCentre().getOrdonnee()){
                        break;
                    }
                }
                }
                else{
                    if(getDirection()==180 || getDirection()==-180){
                        setDirection(270);
                    }
                    else{
                        setDirection(180);
                    }
                }
            }
        }
        
        
        
        //ensuite le cas ou un des deux ou les deux sont égaux
        // modif en cours valide
        // else if(point.getAbscisse() > getCentre().getAbscisse() && point.getOrdonnee() == getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()-getBut().getRayon())
                &&
                (((this.getCentre().getOrdonnee()+this.getRayon()>=getBut().getCentre().getOrdonnee()-getBut().getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()-this.getRayon()>=getBut().getCentre().getOrdonnee()-getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()>=getBut().getCentre().getOrdonnee()+getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon()))
                )
                )
        {
            
            if(getDirection() != 0){
                tournerDirection(0);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                   
                }
            }
        }
        
        
 
        
        // axe des ordonnees inversé attention !
        // modif en cours valide
        //else if(point.getAbscisse() < getCentre().getAbscisse() && point.getOrdonnee() == getCentre().getOrdonnee()){
        else if(
                
                (this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()+getBut().getRayon())
                &&
                (((this.getCentre().getOrdonnee()+this.getRayon()>=getBut().getCentre().getOrdonnee()-getBut().getRayon())&&(this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()-this.getRayon()>=getBut().getCentre().getOrdonnee()-getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()>=getBut().getCentre().getOrdonnee()+getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon()))
                || ((this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()+getBut().getRayon())&&(this.getCentre().getOrdonnee()-this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon()))
                )
                )
        {
            
            if(getDirection() != -180 && getDirection() != 180){
                tournerDirection(180);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        // modif en cours
        //else if(point.getAbscisse() == getCentre().getAbscisse() && point.getOrdonnee() >= getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getOrdonnee()+this.getRayon()<=getBut().getCentre().getOrdonnee()-getBut().getRayon())
                &&
                (((this.getCentre().getAbscisse()+this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()-this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()<=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()>=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                )
                )
        {
            
            if(getDirection() != -90 && getDirection() != 270){
                tournerDirection(270);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        // modif en cours valide
        //else if(point.getAbscisse() == getCentre().getAbscisse() && point.getOrdonnee() <= getCentre().getOrdonnee()){
        
        else if(
                
                (this.getCentre().getOrdonnee()-this.getRayon()>=getBut().getCentre().getOrdonnee()+getBut().getRayon())
                &&
                (((this.getCentre().getAbscisse()+this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()-this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()<=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()>=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                || ((this.getCentre().getAbscisse()-this.getRayon()>=getBut().getCentre().getAbscisse()-getBut().getRayon())&&(this.getCentre().getAbscisse()+this.getRayon()<=getBut().getCentre().getAbscisse()+getBut().getRayon()))
                )
                )
        {
            
            if(getDirection() != 90 && getDirection() != -270){
                tournerDirection(90);
            }
            else{
                for(int i=0;i<this.getVitesse();i++){
                    objetCollision = avancerPrudemment(equipeList,balleList,butList);
                    
                }
            }
        }
        
        else{
            for(int i=0;i<this.getVitesse();i++){
                objetCollision = avancerPrudemment(equipeList,balleList,butList);
            }
            //objetCollision = balle.getCentre();
            //System.out.println("nulllllllll");
            //System.out.println("Le robot est a : (" + this.getCentre().getAbscisse() + "," + this.getCentre().getOrdonnee() + ")");
            
        }
        
        
        
        // il faudra enlever detecter colision a ce niveau et y mettre daans les boucle des if !!
        // il faut recuperer l'objet dans les ifs
        // a la fin, si apres avoir bougé, meme position, ramasser
        //objetCollision = detecterCollision(equipeList,balleList,nouveauCercleTmpplus1,nouveauCercleTmpplus1);
        
        if(objetCollision != null){
           // System.out.println("Il y a collision avec le but : (" + objetCollision.getAbscisse() + "," + objetCollision.getOrdonnee() + ")");
            if(getBut() != null){
                if(objetCollision.getAbscisse() == getBut().getCentre().getAbscisse() && objetCollision.getOrdonnee() == getBut().getCentre().getOrdonnee()){
                    marquer();
                }
                else{
                   if(getDirection() == -90 || getDirection() == 270){
                       getCentre().setOrdonnee(getCentre().getOrdonnee()-1);
                    }
                    else if(getDirection() == 90 || getDirection() == -270){
                        getCentre().setOrdonnee(getCentre().getOrdonnee()+1);
                    }
                    else if(getDirection() == -180 ||getDirection() == 180){
                        getCentre().setAbscisse(getCentre().getAbscisse()+1);
                    }
                    else if(getDirection() == 0){
                        getCentre().setAbscisse(getCentre().getAbscisse()-1);
                    } 
                }
                
            }
        }
        
        
        // a supprimer !
        /*
         * if(point.pointsMemeEndroit(this.getCentre())){
         * // on cherche la balle a ramasser avec le point
         * balle = Balle.rechercherBalleViaPoint(balleList, point);
         * ramasser(balle);
         * // System.out.println("Implementer la methode ramasser et appeler : ramasser(balle)");
         * }
         */
        // si il faut ramasser la balle, chercher celle qui a les coodonnées du point et appeler ramasser avec la balle
        
        
        
    }
    
    
    
    public void ramasser(Balle balle){
        
        String bonus=null;;
        

        
       /* if(bonus.compareToIgnoreCase("rien")==0) { // GROS BUGGGGGGGGGGGGGGGGGGGGGGGGGG
            
            setBalle(balle);
            balle.setRamassable(false);
        }
        
       if(bonus.compareToIgnoreCase("rapide")==0) {
            this.getVitesse();
            balle.setRamassable(false);
            this.getBalle();
        }*/
        
         
           Gballe.playSound();
       
           if(balle.isIsBonus()){
               balle.setRamassable(false);
         switch (balle.bonus()) {
             case "faster": vitesse+=1;
                 break;
             case "slower": vitesse+=(-1);
                if(vitesse<0) vitesse=1;
                break;
             case "death": vitesse=0;
                 break;
             default : break;
            }}
           
         else{
               if(!hasBalle()){
                   setBalle(balle);
                   balle.setRamassable(false);
               }
           }
        }
    
    public void marquer(){
       // System.out.println("Le score de l'equipe de drapeau : " + this.equipe.getDrapeau() + " est : " + getEquipe().getScore());
        getEquipe().setScore(getEquipe().getScore() + getBalle().getValeur());
        setBalle(null);
        Goal.playSound();
    }
    
    
    public void tournerDirection(int nouvelleDirection){
        // il faudra differencer tournerDroite et TournerGauche !!!!
        this.setDirection(nouvelleDirection);
        //System.out.println("La direction est : " + getDirection());
    }
    
    
    public void tourner(boolean directionDefinie, int degre){
        // il faudra differencer tournerDroite et TournerGauche !!!!
        int nbAleatoire;
        
        if(directionDefinie){
            setDirection((getDirection() + degre)%360);
        }
        else{
            java.util.Random r=new java.util.Random();
            nbAleatoire = r.nextInt(2);
            if(nbAleatoire == 0){
                setDirection((getDirection() + 90)%360);
            }
            else{
                setDirection((getDirection() - 90)%360);
            }
        }
        //System.out.println("La direction est : " + getDirection());
    }
    
    
    
    // ajout fonction scan qui renvoie une liste d'evenement et prends en parametre une liste d'équipes et une liste de balles ou une arène
    // -- MAJ -- Doit renvoyer une liste de (event,point)
    // -- doit détecter les balles ramassables et les robots enemi ayant une balle
    public ArrayList<StringPoint> scan(ArrayList<Equipe> listeEquipes, ArrayList<Balle> listeBalles){
        // ArrayList<String> listeEvents = new ArrayList<String>();
        int dist;
        ArrayList<StringPoint> listeEventPoint = new ArrayList<StringPoint>();
        // a completer -> voir papier ! parcours listeballes et listeequipes<listrobots>
        //et avant de la renvoyer fait un tri par distance de l'event par rapport au robot
        // donc les evenement n'ayant pas de coordonnée doivent avoir x,y = 0,0
        
        // scan des robots enemi ayant une balle
        
        
        // scan des balles ramassables
        // parcours de la liste des balles et verification de la distance
        for(int i = 0; i < listeBalles.size();i++){
            if(listeBalles.get(i).isRamassable()){
                dist = (int)Math.sqrt(Math.pow(getCentre().getAbscisse()-listeBalles.get(i).getCentre().getAbscisse(),2) + Math.pow(getCentre().getOrdonnee() - listeBalles.get(i).getCentre().getOrdonnee(),2));
                
                if(dist <= this.getVision()){ // il faudra remplacer par la vision du robot
                    listeEventPoint.add(new StringPoint("balle",new Point(listeBalles.get(i).getCentre().getAbscisse(),listeBalles.get(i).getCentre().getOrdonnee())));
                }
                
            } // fin if is ramassable
        }
        
        /*
         * System.out.println("La liste des events scanné par scan est : ");
         * for(int p = 0;p<listeEventPoint.size();p++){
         * System.out.println("* " + listeEventPoint.get(p).getEventAction() + " au event : (" + listeEventPoint.get(p).getPosition().getAbscisse() + "," + listeEventPoint.get(p).getPosition().getOrdonnee() + ")");
         *
         * }
         */
        
        return listeEventPoint; // pourrait prendre en "parametre" un attribut distance de vue
        
    }
    
    // a continuer
    public ArrayList<StringPoint> checkTimer(){
        
        ArrayList<StringPoint> timer = new ArrayList<StringPoint>();
        if(getTimer()>0){
            timer.add(new StringPoint("timer",new Point(0.0,0.0)));
        }
        else{
            // rien
        }
        return timer;
    }
    
    public ArrayList<StringPoint> checkIHaveABall(){
        
        ArrayList<StringPoint> ihaveaball = new ArrayList<StringPoint>();
        if(getBalle() != null){
            ihaveaball.add(new StringPoint("ihaveaball",new Point(0.0,0.0)));
        }
        else{
            // rien
        }
        /*
         * System.out.println("La liste des events pour IHaveABall est : ");
         * for(int p = 0;p<ihaveaball.size();p++){
         * System.out.println("* " + ihaveaball.get(p).getEventAction() + " au point : (" + ihaveaball.get(p).getPosition().getAbscisse() + "," + ihaveaball.get(p).getPosition().getOrdonnee() + ")");
         *
         * }
         */
        return ihaveaball;
    }
    
    
    // check si il y a un mur devant et a 1 metre, passe en parametre la largeur et la hauteur de l'arène
    public ArrayList<StringPoint> checkMur(double largeur, double hauteur){
        
        ArrayList<StringPoint> mur = new ArrayList<StringPoint>();
        
        // System.out.println("direction = " + direction);
        
        
        if(direction == 0)
        {
            if(this.getCentre().getAbscisse() + this.getRayon() >= largeur)
            {
                mur.add(new StringPoint("mur",new Point(0.0,0.0)));
                //System.out.println("IL Y A UN MUR A + 1 case");
            }
        }
        if(direction == 90 || direction == -270)
        {
            
            if(this.getCentre().getOrdonnee() - this.getRayon() <= 0)
                mur.add(new StringPoint("mur",new Point(0.0,0.0)));
        }
        if(direction == 180 || direction == -180)
        {
            if(this.getCentre().getAbscisse() - this.getRayon() <= 0)
                mur.add(new StringPoint("mur",new Point(0.0,0.0)));
        }
        if(direction == 270 || direction == -90)
        {
            if(this.getCentre().getOrdonnee() + this.getRayon() >= hauteur)
                mur.add(new StringPoint("mur",new Point(0.0,0.0)));
        }
        else{
            
            // System.out.println("ERREUR");
        }
        
        
        //  System.out.println("FIN de checkMur");
        return mur;
    }
    
    
    // check si il y a un mur devant et a 1 metre
    // public ArrayList<String> checkEmotion(){
    
    //  }
    
    public ArrayList<Automate> getAutomates() {
        return automates;
    }
    
    public void setAutomates(ArrayList<Automate> automates) {
        this.automates = automates;
    }
    
    public int getDirection() {
        return direction;
    }
    
    public void setDirection(int direction) {
        this.direction = direction;
    }
    
    public Equipe getEquipe() {
        return equipe;
    }
    
    public void setEquipe(Equipe equipe) {
        this.equipe = equipe;
    }
    
    public String getNomEquipe() {
        return nomEquipe;
    }
    
    public int getTempsCache() {
        return tempsCache;
    }
    
    public void setTempsCache(int tempsCache) {
        this.tempsCache = tempsCache;
    }
    
    public int getVision() {
        return vision;
    }
    
    public void setVision(int vision) {
        this.vision = vision;
    }
    
    public double getVitesse() {
        return vitesse;
    }
    
    public void setVitesse(double vitesse) {
        this.vitesse = vitesse;
    }
    
    public int getTimer() {
        return timer;
    }
    
    public void setTimer(int timer) {
        this.timer = timer;
    }
    
    public Balle getBalle() {
        return balle;
    }
    
    public void setBalle(Balle balle) {
        this.balle = balle;
    }
    
    public But getBut() {
        return but;
    }
    
    public void setBut(But but) {
        this.but = but;
    }
    
    
    
    // prendra en parametre un string et une balle et un robot. But devrait etre dans equipe
    public void update(StringPoint action, ArrayList<Equipe> equipeList, ArrayList<Balle> balleList, ArrayList<But> butList) {
        //System.out.println("*-*-*-* Dans update de robot, l'action est : " + action.getEventAction());
        
        //System.out.println("**la position de l'action est : (" + action.getPosition().getAbscisse() + "," + action.getPosition().getOrdonnee() + ")");
        
        if(action.getEventAction().compareTo("rechercherballe") == 0){ // remplacer le nom de l'action par rechercherBalle
            avancerTournerTimeravance(equipeList,balleList,butList);
        }
        else if(action.getEventAction().compareTo("tourner") == 0){
            tourner(false,0);
        }
        else if(action.getEventAction().compareTo("sedirigerversballe") == 0){
            //System.out.println("L'action est se diriger vers la balle");
            seDirigerVersBalle(action.getPosition(), balleList, equipeList, butList);
        }
        else if(action.getEventAction().compareTo("sedirigerversbut") == 0){
            seDirigerVersBut(balleList, equipeList, butList);
        }
        
        // sinon ne fait rien
    }
    
    
    public static Robot rechercherRobotViaPoint(ArrayList<Equipe> equipeList, Point point) {
        Robot robot = null;
        
        for(int i = 0; i < equipeList.size();i++){
            for(int j = 0; j < equipeList.get(i).getListeRobots().size();j++){
                if(point.pointsMemeEndroit(equipeList.get(i).getListeRobots().get(j).getCentre())){
                    robot = equipeList.get(i).getListeRobots().get(j);
                }
            }
        }
        return robot;
    }
    
    public boolean hasBalle(){
        return (balle!=null);
    }
    
    public int getTimerAvance() {
        return timerAvance;
    }
    
    public void setTimerAvance(int timerAvance) {
        this.timerAvance = timerAvance;
    }
    
    public int getTimerAvanceMax() {
        return timerAvanceMax;
    }
    
    public void setTimerAvanceMax() {
        int valMin = 50;
        int valMax = 200;
        int valeur;
        Random r = new Random();
        valeur = valMin + r.nextInt(valMax - valMin);
        this.timerAvanceMax = valeur;
    }
    
    
    
    
    public static void genererPositionRobotsUneEquipe(ArrayList<Robot> robotList, ArrayList<Balle> balleList, ArrayList<But> butList, double largeurArene, double hauteurArene,ArrayList<Equipe> equipeListTmp){
        
        // if faut un random dans la position.
        // gestion des colisions ???? !
        int largeurMin;
        int largeurMax;
        int hauteurMin;
        int hauteurMax;
        double abscisse;
        double ordonnee;
        
        Point collision = null;
       
        
        Point nvPoint = null;
        Cercle nvCercle = null;
        
       // ArrayList<Robot> robotListTmp = new ArrayList<Robot>(); // il faut vraiement fait l'allocation ici
        //Equipe equipeTmp = new Equipe();
        //ArrayList<Equipe> equipeListTmp = new ArrayList<Equipe>(); 

        //equipeTmp.setListeRobots(robotListTmp);
       // equipeListTmp.add(equipeTmp);
        
        Random r = new Random();
        
        // doit test dans la liste d'equipe temporaire si aucun conflit !
        // doit test dans la liste des nouveau robots si aucun conflit
        
        
        for (int i=0;i<robotList.size();i++){
            //System.out.println("I vaut : " + i);
            do{
            //robotList.get(i).setCentre(new Point);
            largeurMin = (int)robotList.get(i).getRayon();
            largeurMax = (int)(largeurArene-robotList.get(i).getRayon());
            hauteurMin = (int)robotList.get(i).getRayon();
            hauteurMax = (int)(hauteurArene-robotList.get(i).getRayon());
            
            abscisse = largeurMin + r.nextInt(largeurMax - largeurMin); // cast implicite
            ordonnee = hauteurMin + r.nextInt(hauteurMax - hauteurMin); // cast implicite
            
            nvPoint = new Point(abscisse,ordonnee);
            nvCercle = new Cercle(nvPoint,robotList.get(i).getRayon()*2);
                
            collision = null;
   
            //robotList.get(i).setCentre(new Point(abscisse,ordonnee));
            // a modifier
            collision = detecterCollision(equipeListTmp,balleList, butList ,nvCercle, nvCercle); // attention a balleList.get(i), c'est une balle et on attends un cercle
            /*
            if(collision != null){
                System.out.println("Collision bidule");
            }
            else{
                 System.out.println("PAS de collision bidule");
            }
            */
            }while(collision != null);
           // System.out.println("Le nouveau point est "+nvPoint.getAbscisse() +","+nvPoint.getOrdonnee()+")");
            
            
            robotList.get(i).setCentre(nvPoint);
            equipeListTmp.get(equipeListTmp.size()-1).getListeRobots().add(robotList.get(i)); // on ajoute le robot placé a la liste temporaire
            // balleListTmp.add(balleList.get(i));
            // ajoute la balle dans une liste de balle ajoutée
            
            
           // System.out.println("Le robot " + i + " au point : ("+robotList.get(i).getCentre().getAbscisse() +","+robotList.get(i).getCentre().getOrdonnee()+")");
        }
       
        /*
        if(robotList == null){
          System.out.println("le robot list est nul");  
        }
        else{
                      System.out.println("le robot list n'est PAS nul");  

        }
       */
    }

    
    
            }
    




